Skip to content
  • CE Tool Lua Regular expressions 2

    Плагин-строй
    2
    0 Голоса
    2 Сообщения
    26 Просмотры
    MasterGHM
    Lua поиск элемента до и после строки

    Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше

    В утилите "Lua Regular Expressions (v. 1.0)"
    image.png
    Текст во вкладке "gmatch"

    Game1
    gameCompany
    DAU
    53.21k
    -20%
    Game2
    gameCompany
    DAU
    20.35k
    -20%

    Поиск элемента после строки: "DAU "DAU%c%c(.-)%c%c"

    53.21k;20.35k;

    Поиск элемента до строки: "%c%c(.-)gameCompany%c%c"
    (паттерн со двигом скобок для поиска предыдущей фразы)
    не прокатит для вывода списка игр над фразой gameCompany

    ;53.21k
    -20%

    Game2
    ;

    Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз.

    Cначала добавим первую пустую строку и видим повторяющиеся фрагменты

    "%c%cGame1%c%cgameCompany%c%c"

    пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо

    Game1;53.21k
    -20%

    Game2;

    Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем "%c%c(%w-)%c%cgameCompany%c%c"

    Game1;Game2;
    И тогда все ок.

    Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда "%c%c(%w-)%c%cgameCompany%c%c"

    Game2;
    Не видит Game1.

    Значит мы можем убрать %c%c, и будет "(%w-)%c%cgameCompany"

    Game1;Game2;

    Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет

    My Game1: my Game

    gameCompany

    DAU

    53.21k

    -20%

    My Game2: my Game

    gameCompany

    DAU

    20.35k

    -20%

    Пробуем "(%w-)%c%cgameCompany"

    Game;Game;
    Что не верно, т.к. захват одним (%w-)

    Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие

    '([%w%s]-)%c%cgameCompany'

    my Game; my Game;

    Затем ([:%w%s]-)%c%cgameCompany

    My Game1: my Game;

    My Game2: my Game;

    Затем %c?%c?([:%w%s]-)%c%cgameCompany

    My Game1: my Game;
    My Game2: my Game;

    Вот и все. Если попариться один раз, то тексты уже парсить будет гораздо быстрее.

    Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк

    p.s. Текст в консоли Lua отличается %c%c, а %с

    p.s.p.s. Можно раcсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"

  • CE disassembler

    Плагин-строй
    1
    0 Голоса
    1 Сообщения
    638 Просмотры
    Нет ответов
  • Поиск в региона памяти модуля

    Приёмы
    5
    0 Голоса
    5 Сообщения
    43 Просмотры
    PitronicP

    screen.jpg
    вот доказательство что старым версиям твой плагин нужен будет.

  • CE Script Editor [Notepad+]

    Перенесена Плагин-строй
    1
    0 Голоса
    1 Сообщения
    24 Просмотры
    Нет ответов
  • CE Lua чистка памяти от утечек

    Плагин-строй
    2
    0 Голоса
    2 Сообщения
    22 Просмотры
    MasterGHM
    Оптимизация CE Lua кода по сборке мусора

    Есть инструкции, которые добавляют мусора больше чем другие.
    Показываем объем памяти мусора

    print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024))

    Ниже код того как попробовать узнать сколько мусора добавил код при парсинге ассемблерной строки двумя способами

    local s = " 0045464A - FF 05 A4B54500 - inc [0045B5A4] { [000003EA] }" function GetDebugString(address) return splitDisassembledString(s) end \-- address, bytes, opcode function GetDebugString2(address) local clearString = string.gsub(s, '%s','') return string.match(clearString, '^(.-)%-(.-)%-(.-)$') end function NoOptimizeCode() GetDebugString2() end function OptimizeCode() GetDebugString() end local countRepeat = 500000 -- add more cycle local x1 = 0 local x2 = 0 x1 = getTickCount() print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) for i = 1, countRepeat do NoOptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) x2 = getTickCount() for i = 1, countRepeat do OptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) print(string.format("%.2f", (x2 - x1)/(getTickCount() - x2)) )

    Пример результатов могут отличаться. Фиг его знает почему. Возможно работает сборщик мусора в разные моменты времени

    Lua memory usage 1.8 MiB
    Lua memory usage 1.8 MiB
    Lua memory usage 1.8 MiB
    1.49

    Lua memory usage 1.8 MiB
    Lua memory usage 2.3 MiB
    Lua memory usage 2.3 MiB
    1.47

    Lua memory usage 2.3 MiB
    Lua memory usage 2.8 MiB
    Lua memory usage 2.8 MiB
    1.49

  • CE Lua ColorPicker (скрытый компонент)

    Плагин-строй
    6
    0 Голоса
    6 Сообщения
    50 Просмотры
    PitronicP

    значит не мой случай, мне женька только экзешники скинул, а как я понял нужны полностью исходники.

  • 0 Голоса
    2 Сообщения
    32 Просмотры
    MasterGHM
    Ищем свойства userData.

    UserData в Lua это пользовательский тип. Точно не знаю, но я думаю в документации в CE Lua (celua.txt или здесь на офф. сайте) тип userData у всех классов или большинства классов. Например, проверим, что главная форма CE это userData тип

    local mainFormCE = getMainForm() print(type(mainFormCE)) > userdata (вывод из консоли)

    Выводим список свойств следующим образом через getmetatable функцию. Метатаблица — это особая таблица свойств Lua-переменной

    local mainForm = getMainForm() local listUserData = createStringlist() for k,_ in pairs(getmetatable(mainForm)) do listUserData.add(k) end local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listUserData, allowCustomInput) print ('Index: '..id..", Name: "..name) listUserData.destroy()

    Результат в виде списка свойство переменной mainForm
    1a800863-fb55-46e7-a2b0-b3daed1613af-изображение.png
    Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются.

    Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое

    local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912))

    Случайное свое впишем ради наглядного примера
    mainFormCE.setColor(546484)

    72d5c265-f388-4d4f-b24c-f3dcb46d8f39-изображение.png

  • CE Вывод иерархии компонентов

    Плагин-строй
    1
    0 Голоса
    1 Сообщения
    25 Просмотры
    Нет ответов